home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Forever 4
/
Atari Forever 4.zip
/
Atari Forever 4.iso
/
SERIE_S
/
S_904
/
MINE
/
MINE.LST
< prev
next >
Wrap
File List
|
1998-03-14
|
8KB
|
401 lines
DEFMOUSE 0
DEFTEXT ,,,13
DIM feld|(17,17)
DIM t%(10),name$(10)
DIM m&(16)
'
lade_high
'
'
adr%=V:m&(0)
ww&=x_len|*16
wh&=y_len|*16+33
CLIP OFFSET wx&,wy&
~WIND_CALC(0,&X1011,wx&,wy&,ww&,wh&,wx&,wy&,ww&,wh&)
handle&=WIND_CREATE(&X1011,wx&,wy&,ww&,wh&)
'
titel$=" Minenfeld "+CHR$(0)
~WIND_SET(handle&,2,CARD(SWAP(V:titel$)),CARD(V:titel$),0,0)
'
~WIND_OPEN(handle&,wx&,wy&,ww&,wh&)
'
erstelle
REPEAT
rate
~@taste
IF gewonnen!=FALSE
t%=99999
ENDIF
highscore(t%)
IF wclose!=FALSE
ende!=0
gewonnen!=0
erstelle
~WIND_GET(handle&,4,wx&,wy&,ww&,wh&)
DEFFILL 0,0,0
PBOX 0,0,ww&-1,wh&-1
aufbau
ENDIF
UNTIL wclose!
'
~WIND_CLOSE(handle&)
~WIND_DELETE(handle&)
'
speicher_high
'
PROCEDURE lade_high
LOCAL n$
wx&=97
wy&=100
n$=DIR$(0)+"\MINEHIGH.SCR"
IF EXIST(n$)
OPEN "I",#1,n$
INPUT #1,x_len|
INPUT #1,y_len|
INPUT #1,minen|
FOR i|=1 TO 10
INPUT #1,t%(i|)
INPUT #1,name$(i|)
NEXT i|
CLOSE #1
ELSE
x_len|=16
y_len|=16
minen|=40
ARRAYFILL t%(),99999
FOR i|=1 TO 10
LET name$(i|)="niemand"
NEXT i|
ENDIF
RETURN
PROCEDURE speicher_high
OPEN "o",#1,DIR$(0)+"\MINEHIGH.SCR"
PRINT #1,x_len|
PRINT #1,y_len|
PRINT #1,minen|
FOR i|=1 TO 10
PRINT #1,t%(i|);",";name$(i|)
NEXT i|
CLOSE #1
RETURN
> PROCEDURE erstelle
' Erstellt ein Minenfeld in feld|() mit minen| Minen
LOCAL i|,x|,y|
ARRAYFILL feld|(),0
REPEAT
x|=RANDOM(x_len|)+1
y|=RANDOM(y_len|)+1
IF feld|(x|,y|)=0
feld|(x|,y|)=1
INC i|
ENDIF
UNTIL i|=minen|
verdeckt&=x_len|*y_len|
marken&=minen|
t%=-1
h%=2^30
RETURN
'
> PROCEDURE aufbau
LOCAL x|,y|
BOUNDARY 0
FOR x|=1 TO x_len|
FOR y|=1 TO y_len|
punkt(x|,y|)
NEXT y|
NEXT x|
werte
RETURN
> PROCEDURE werte
TEXT 2,y_len|*16+16-3,"Marken: "+STR$(marken&)+" "
IF ende!=0
IF t%>0
TEXT 2+12*8,y_len|*16+16-3,"Zeit: "+STR$(INT((TIMER-t%)/200))+" "
ENDIF
ELSE
TEXT 2+12*8,y_len|*16+16-3,"Zeit: "+STR$(INT(t%)/10)+" "
IF minen|=verdeckt&
TEXT 2,y_len|*16+32-3,"GEWONNEN"
ELSE
TEXT 2,y_len|*16+32-3,"Nicht geschafft"
ENDIF
TEXT 2+x_len|*16-10*8,y_len|*16+32-3,"- Taste -"
ENDIF
RETURN
> PROCEDURE punkt(x|,y|)
LOCAL s|
~WIND_GET(handle&,4,wx&,wy&,ww&,wh&)
CLIP OFFSET wx&,wy&
'
SELECT feld|(x|,y|)
CASE 0,1 !Nicht aufgedeckt
3d_box(x|,y|)
IF feld|(x|,y|)=1 AND ende!
text(x|,y|,ASC("M"))
ENDIF
CASE 2 !Frei
box(x|,y|)
s|=@um(x|,y|)
IF s|
text(x|,y|,ASC(STR$(s|)))
ENDIF
CASE 11,10 !Markiert
IF feld|(x|,y|)=10 AND ende!
box(x|,y|)
ELSE
3d_box(x|,y|)
ENDIF
kreuz(x|,y|)
ENDSELECT
RETURN
> PROCEDURE 3d_box(x|,y|)
DEFFILL 1,2,4
PBOX (x|-1)*16+2,(y|-1)*16+2,x|*16-2,y|*16-2
LINE x|*16-1,(y|-1)*16+1,x|*16-1,y|*16-1
LINE (x|-1)*16+1,y|*16-1,x|*16-1,y|*16-1
RETURN
> PROCEDURE box(x|,y|)
DEFFILL 1,2,1
PBOX (x|-1)*16+1,(y|-1)*16+1,x|*16-1,y|*16-1
RETURN
> PROCEDURE kreuz(x|,y|)
DEFLINE ,3
LINE (x|-1)*16+2,(y|-1)*16+2,x|*16-2,y|*16-2
LINE x|*16-2,(y|-1)*16+2,(x|-1)*16+2,y|*16-2
DEFLINE ,1
RETURN
> PROCEDURE text(x|,y|,char|)
GRAPHMODE 2
TEXT (x|-1)*16+16/4,y|*16-2,CHR$(char|)
GRAPHMODE 1
RETURN
> FUNCTION um(x|,y|)
LOCAL s|
s|=@mine(x|-1,y|-1)+@mine(x|,y|-1)+@mine(x|+1,y|-1)
s|=s|+@mine(x|-1,y|)+@mine(x|+1,y|)
s|=s|+@mine(x|-1,y|+1)+@mine(x|,y|+1)+@mine(x|+1,y|+1)
RETURN s|
ENDFUNC
> FUNCTION mine(x|,y|)
IF feld|(x|,y|)=1 OR feld|(x|,y|)=11
RETURN 1
ELSE
RETURN 0
ENDIF
ENDFUNC
'
> PROCEDURE rate
LOCAL x|,y|,mt&
REPEAT
mt&=@waehle(x|,y|)
IF x|>0 AND y|>0 AND wclose!=FALSE
IF mt&=1 !Freimachen
IF t%=-1
t%=TIMER
h%=0
ENDIF
IF feld|(x|,y|)=0 !freies Feld
free(x|,y|)
gewonnen!=(verdeckt&=minen|)
ende!=gewonnen!
ELSE IF feld|(x|,y|)=1 !Fehler -> Ende
ende!=TRUE
ENDIF
IF ende!
t%=(TIMER-t%)/20
ENDIF
ELSE !IF mt&=2
IF feld|(x|,y|)<=1 !Markieren
ADD feld|(x|,y|),10
DEC marken&
ELSE IF feld|(x|,y|)=>10 !Marke Löschen
SUB feld|(x|,y|),10
INC marken&
ENDIF
punkt(x|,y|)
ENDIF
ENDIF
UNTIL ende!
IF wclose!=FALSE
werte
FOR x|=1 TO x_len|
FOR y|=1 TO y_len|
IF feld|(x|,y|)=1 AND gewonnen!
marken&=0
feld|(x|,y|)=11
punkt(x|,y|)
werte
ENDIF
IF feld|(x|,y|)=10 OR feld|(x|,y|)=1
punkt(x|,y|)
ENDIF
NEXT y|
NEXT x|
'
ENDIF
RETURN
FUNCTION waehle(VAR x|,y|)
LOCAL mx&,my&,mt&,d&,e&
' auf Maus und Fenster warten
~EVNT_BUTTON(1,3,0) !keine linke Taste
REPEAT
e&=EVNT_MULTI(&X110000,1,3,1,0,0,0,0,0,0,0,0,0,0,adr%,10,mx&,my&,mt&,d&,d&,d&)
mt&=GINTOUT(3)
' f c m s 1 2 3 4 5 1 2 3 4 5 a c mx my mk k t anz
IF e& AND &X10000
fensterverw
ELSE IF e& AND &X100000
IF h%<TIMER-t%
~WIND_GET(handle&,10,wx&,d&,d&,d&)
IF wx&=handle&
ADD h%,200
werte
ENDIF
ENDIF
ENDIF
UNTIL (mt&>0) OR ende!
~WIND_GET(handle&,4,wx&,wy&,ww&,wh&)
'
x|=MAX((INT(mx&-wx&)/16)+1,0)
IF x|>x_len|
x|=0
ENDIF
'
y|=MAX(INT((my&-wy&)/16)+1,0)
IF y|>y_len|
y|=0
ENDIF
RETURN MIN(mt&,2)
ENDFUNC
> PROCEDURE free(x|,y|)
' Ein Feld ohne Mine wurde als solches erkannt. Falls auf keinem
' Nachbarfeld eine Mine liegt, werden alle eindeutig freien Felder
' auch aufgedeckt.
'
LOCAL i|,j|
feld|(x|,y|)=2
punkt(x|,y|)
DEC verdeckt&
IF @um(x|,y|)=0
FOR i|=MAX(x|-1,1) TO MIN(x|+1,x_len|)
FOR j|=MAX(y|-1,1) TO MIN(y|+1,y_len|)
IF feld|(i|,j|)=0
free(i|,j|)
ENDIF
NEXT j|
NEXT i|
ENDIF
RETURN
'
> PROCEDURE fensterverw
SELECT m&(0)
CASE 20 !REDRAW
wredraw(handle&,m&())
CASE 21 !TOPPED
wtopped(handle&)
CASE 22 !CLOSED
ende!=TRUE
wclose!=TRUE
CASE 28 !MOVED
wmoved(handle&,m&())
ENDSELECT
RETURN
> PROCEDURE wtopped(handle&)
~WIND_SET(handle&,10,0,0,0,0)
RETURN
> PROCEDURE wmoved(handle&,VAR m&())
LOCAL wx&,wy&,d&,d&
m&(4)=(m&(4) AND &HFFFFFFF8)
m&(5)=(m&(5) AND &HFFFFFFF8)+1
~WIND_SET(handle&,5,m&(4),m&(5),m&(6),m&(7))
~WIND_GET(handle&,4,wx&,wy&,d&,d&)
CLIP OFFSET wx&,wy&
RETURN
> PROCEDURE wredraw(handle&,VAR m&())
LOCAL wx&,wy&,ww&,wh&
'
~WIND_UPDATE(3)
~WIND_GET(handle&,11,wx&,wy&,ww&,wh&) !erstes Fensterrechteck abfragen
REPEAT
IF RC_INTERSECT(m&(4),m&(5),m&(6),m&(7),wx&,wy&,ww&,wh&)
CLIP wx&,wy&,ww&,wh&
DEFFILL 0,0,0
PBOX 0,0,ww&-1,wh&-1
IF high!
high_redraw
ELSE
aufbau
ENDIF
ENDIF
~WIND_GET(handle&,12,wx&,wy&,ww&,wh&) !Weitere Fensterrechtecke
UNTIL wh&=0 OR ww&=0
~WIND_UPDATE(2)
CLIP OFF
RETURN
'
> PROCEDURE highscore(t%)
LOCAL i|,j|
IF wclose!=0
high!=TRUE
~WIND_GET(handle&,4,wx&,wy&,ww&,wh&)
DEFFILL 0,0,0
PBOX 1,1,ww&-1,wh&-1
FOR i|=1 TO 10
IF t%<t%(i|) AND j|=0
INSERT t%(i|)=t%
INSERT name$(i|)="_"
j|=i|
ENDIF
a|=5-LEN(STR$(t%(i|)))
TEXT 2,i|*16,SPACE$(a|)+STR$(t%(i|)/10)
TEXT 2+7*8,i|*16,name$(i|)
NEXT i|
'
IF j|>0
REPEAT
TEXT 2+7*8,j|*16,name$(j|)+" "
key&=@taste
'
LET name$(j|)=@left$(name$(j|))
key&=key& MOD 256
IF key&=8 AND LEN(name$(j|))
LET name$(j|)=@left$(name$(j|))
ELSE IF LEN(name$(j|))<10 AND key&>31
LET name$(j|)=name$(j|)+CHR$(key&)
ENDIF
LET name$(j|)=name$(j|)+"_"
UNTIL key&=13 OR wclose!
LET name$(j|)=@left$(name$(j|))
TEXT 2+7*8,j|*16,name$(j|)+" "
ENDIF
taste!=TRUE
~@taste
taste!=FALSE
high!=FALSE
ENDIF
RETURN
> FUNCTION taste
LOCAL d&,key&,evnt&
WHILE evnt&<>1 AND wclose!=FALSE
evnt&=EVNT_MULTI(&X10001,0,0,0,0,0,0,0,0,0,0,0,0,0,adr%,10,d&,d&,d&,d&,key&,d&)
IF evnt&=&X10000
adr%=V:m&(0)
fensterverw
ENDIF
WEND
' UNTIL evnt&=1 OR wclose!
RETURN (key& MOD 256)
ENDFUNC
DEFFN left$(a$)=LEFT$(a$,LEN(a$)-1)
> PROCEDURE high_redraw
LOCAL i|,a|
FOR i|=1 TO 10
a|=5-LEN(STR$(t%(i|)))
TEXT 2,i|*16,SPACE$(a|)+STR$(t%(i|)/10)
TEXT 2+7*8,i|*16,name$(i|)+" "
NEXT i|
IF taste!
TEXT 2+x_len|*16-10*8,y_len|*16+32-3,"- Taste -"
ENDIF
RETURN